/**
 * 将 ISO 8601 格式的日期字符串转换为 yyyy-mm-dd 格式
 * @param {string} isoDate - ISO 8601 格式的日期字符串
 * @returns {string} yyyy-mm-dd 格式的日期字符串
 */
export function formatDate(isoDate) {
  const date = new Date(isoDate);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

/**
 * 自定义格式化日期时间
 * @param {string|Date} date - 日期字符串或Date对象
 * @param {string} format - 格式化字符串，如 'yyyy-MM-dd HH:mm:ss'
 * @returns {string} 格式化后的日期时间字符串
 */
export function formatDateTime(date, format = 'yyyy-MM-dd HH:mm:ss') {
  if (!(date instanceof Date)) {
    date = new Date(date);
  }
  
  const map = {
    yyyy: date.getFullYear(),
    MM: String(date.getMonth() + 1).padStart(2, '0'),
    dd: String(date.getDate()).padStart(2, '0'),
    HH: String(date.getHours()).padStart(2, '0'),
    mm: String(date.getMinutes()).padStart(2, '0'),
    ss: String(date.getSeconds()).padStart(2, '0')
  };

  return format.replace(/yyyy|MM|dd|HH|mm|ss/g, matched => map[matched]);
}

/**
 * 将时间戳转换为Date对象
 * @param {number} timestamp - 时间戳（毫秒）
 * @returns {Date} 转换后的Date对象，如果timestamp无效则返回当前时间
 */
export function timestampToDate(timestamp) {
  if (typeof timestamp !== 'number' || isNaN(timestamp) || timestamp <= 0) {
    return new Date();
  }
  return new Date(timestamp);
}

/**
 * 将日期转换为 ISO 8601 格式 (2025-01-21T16:00:00.000Z)
 * @param {Date|string} date - Date对象或日期字符串
 * @returns {string} ISO 8601 格式的日期字符串
 */
export function toISO8601(date) {
  if (!(date instanceof Date)) {
    date = new Date(date);
  }
  return date.toISOString();
}

/**
 * 将 ISO 8601 格式字符串或 Unix 时间戳（秒）转换为 Date 对象
 * @param {string|number} input - ISO 8601 格式的日期时间字符串或 Unix 时间戳（秒）
 * @returns {Date} 转换后的 Date 对象，如果输入无效则返回当前时间
 */
export function parseISO8601(input) {
  if (typeof input === 'string') {
    const date = new Date(input);
    return isNaN(date.getTime()) ? new Date() : date;
  } else if (typeof input === 'number') {
    // Convert seconds to milliseconds
    return new Date(input * 1000);
  }
  return new Date();
}
